# -*- coding: utf-8 -*-
"""
文件处理工具模块
负责读取和处理输入文件
"""
import os
import chardet
from typing import List, Optional


class FileHandler:
    """文件处理工具类"""
    
    def read_file_list(self, file_path: str) -> List[str]:
        """
        读取包含文件名列表的文本文件
        
        :param file_path: 文件路径
        :return: 文件名列表
        """
        if not os.path.exists(file_path):
            raise FileNotFoundError(f"文件不存在: {file_path}")
        
        # 检测文件编码
        encoding = self._detect_encoding(file_path)
        
        try:
            with open(file_path, 'r', encoding=encoding) as f:
                content = f.read()
            
            # 提取文件名
            filenames = self._extract_filenames(content)
            
            # 过滤空行和无效文件名
            filenames = [name.strip() for name in filenames if name.strip()]
            
            return filenames
            
        except Exception as e:
            raise Exception(f"读取文件失败: {str(e)}")
    
    def _detect_encoding(self, file_path: str) -> str:
        """
        检测文件编码
        
        :param file_path: 文件路径
        :return: 编码名称
        """
        try:
            with open(file_path, 'rb') as f:
                raw_data = f.read()
            
            # 使用chardet检测编码
            result = chardet.detect(raw_data)
            encoding = result['encoding']
            
            # 常见编码的优先级处理
            if encoding:
                encoding = encoding.lower()
                
                # UTF-16 处理
                if 'utf-16' in encoding:
                    return 'utf-16'
                # UTF-8 处理
                elif 'utf-8' in encoding:
                    return 'utf-8'
                # GBK/GB2312 处理
                elif 'gb' in encoding:
                    return 'gbk'
                # Windows编码处理
                elif 'windows' in encoding or 'cp' in encoding:
                    return encoding
                else:
                    return encoding
            else:
                # 默认尝试UTF-8
                return 'utf-8'
                
        except Exception:
            # 如果检测失败，默认使用UTF-8
            return 'utf-8'
    
    def _extract_filenames(self, content: str) -> List[str]:
        """
        从文件内容中提取文件名
        
        :param content: 文件内容
        :return: 文件名列表
        """
        filenames = []
        
        # 按行分割
        lines = content.split('\n')
        
        for line in lines:
            # 清理行内容
            line = line.strip()
            
            if not line:
                continue
            
            # 检查是否为目录树格式（如 "| |-filename.mp4"）
            if '|-' in line:
                # 提取文件名部分
                filename = self._extract_from_tree_format(line)
                if filename:
                    filenames.append(filename)
            else:
                # 直接作为文件名
                filenames.append(line)
        
        return filenames
    
    def _extract_from_tree_format(self, line: str) -> Optional[str]:
        """
        从目录树格式中提取文件名
        
        :param line: 目录树格式的行
        :return: 文件名或None
        """
        # 查找最后一个 "|-" 之后的内容
        parts = line.split('|-')
        
        if len(parts) >= 2:
            filename = parts[-1].strip()
            
            # 检查是否为有效的视频文件名
            if self._is_valid_video_filename(filename):
                return filename
        
        return None
    
    def _is_valid_video_filename(self, filename: str) -> bool:
        """
        检查是否为有效的视频文件名
        
        :param filename: 文件名
        :return: 是否有效
        """
        # 检查是否有文件扩展名
        if '.' not in filename:
            return False
        
        # 常见视频文件扩展名
        video_extensions = ['.mp4', '.avi', '.mkv', '.wmv', '.mpg', '.mov', '.flv', '.m4v', '.webm']
        
        # 检查扩展名
        for ext in video_extensions:
            if filename.lower().endswith(ext):
                return True
        
        return False
    
    def save_report(self, report_content: str, output_path: str) -> None:
        """
        保存报告到文件
        
        :param report_content: 报告内容
        :param output_path: 输出文件路径
        """
        try:
            # 确保输出目录存在
            output_dir = os.path.dirname(output_path)
            if output_dir and not os.path.exists(output_dir):
                os.makedirs(output_dir)
            
            with open(output_path, 'w', encoding='utf-8') as f:
                f.write(report_content)
                
        except Exception as e:
            raise Exception(f"保存报告失败: {str(e)}")
    
    def validate_input_file(self, file_path: str) -> bool:
        """
        验证输入文件的有效性
        
        :param file_path: 文件路径
        :return: 是否有效
        """
        if not os.path.exists(file_path):
            return False
        
        if not os.path.isfile(file_path):
            return False
        
        # 检查文件大小（避免空文件）
        if os.path.getsize(file_path) == 0:
            return False
        
        return True